package com.design_pattern.singleton;

public class SingletonC {
    private static  SingletonC singletonC = null;

    private SingletonC() {

    }

    /**
     * 双层检测锁 这种在特殊情况下会出现 空指针异常主要是由于指令重排序导致的
     * 所以对 singletonC 加上 volatile 来防止指令重排序
     * 所以第4行正确的格式是
     * private static volatile SingletonC singletonC = null;
     * instance = new Singleton();
     * 这一行代码中，执行了三条重要的指令：
     * 1 分配对象的内存空间
     * 2 初始化对象
     * 3 将变量 instance 指向刚分配的内存空间
     * 在这个过程中，如果第二条指令和第三条指令发生了重排序，可能导致 instance 还未初始化时，其他线程提前通过双检锁外层的 null 检查，获取到“不为 null，但还没有执行初始化”的 instance 对象，发生空指针异常。
     *
     * @return
     */
    public static SingletonC getInstance() {
        if (singletonC == null) {
            synchronized (singletonC) {
                if (singletonC == null) {
                    singletonC = new SingletonC();
                }
            }
        }
        return singletonC;
    }
}
